﻿#pragma once
#include <QAbstractTableModel>
#include "common/datatypes.h"

class ParameterTableModel : public QAbstractTableModel
{
    Q_OBJECT
public:
    /**
     * @brief ParameterTableModel::ParameterTableModel
     * @details 构造参数表模型并指定父对象。
     * @param parent Qt 父对象。
     */
    explicit ParameterTableModel(QObject *parent = nullptr);

    /**
     * @brief ParameterTableModel::setTransducerSourceUnit
     * @details 设置换能器表的源单位。
     * @param unit 源单位字符串。
     */
    void setTransducerSourceUnit(const QString &unit);
    /**
     * @brief ParameterTableModel::setTransducerTargetUnit
     * @details 设置换能器表的目标单位。
     * @param unit 目标单位字符串。
     */
    void setTransducerTargetUnit(const QString &unit);

    /**
     * @brief ParameterTableModel::setKind
     * @details 切换模型类型并重置数据。
     * @param k 参数表类型。
     */
    void setKind(ParamTableKind k);
    ParamTableKind kind() const { return m_kind; }
    /**
     * @brief ParameterTableModel::setHeaderText
     * @details 设置指定列的表头文字。
     * @param column 列索引。
     * @param text 表头文本。
     */
    void setHeaderText(int column, const QString &text);
    /**
     * @brief ParameterTableModel::applyNonCalHeaders
     * @details 批量设置非校准表的单位表头。
     * @param freqUnit 频率单位。
     * @param valUnit 数值单位。
     */
    void applyNonCalHeaders(const QString &freqUnit, const QString &valUnit);

    // 装载数据
    /**
     * @brief ParameterTableModel::setDataAtt
     * @details 装载衰减表数据。
     * @param list 衰减数据。
     */
    void setDataAtt(const AttTableList &list);
    /**
     * @brief ParameterTableModel::setDataTransducer
     * @details 装载换能器表数据。
     * @param list 换能器数据。
     */
    void setDataTransducer(const TransducerTableList &list);
    /**
     * @brief ParameterTableModel::setDataLimitLine
     * @details 装载极限线表数据。
     * @param list 极限线数据。
     */
    void setDataLimitLine(const LimitLineList &list);
    /**
     * @brief ParameterTableModel::setDataFreq
     * @details 装载频率表数据。
     * @param rows 频率列表。
     */
    void setDataFreq(const QList<FreqTableConfig> &rows);
    /**
     * @brief ParameterTableModel::setDataCal
     * @details 装载校准表数据。
     * @param rows 校准列表。
     */
    void setDataCal(const QList<CalTableConfig> &rows);

    // 导出数据（保存用）
    AttTableList att() const { return m_att; }
    TransducerTableList transducer() const { return m_trans; }
    LimitLineList limitLine() const { return m_limit; }
    QList<FreqTableConfig> freq() const { return m_freq; }
    QList<CalTableConfig> cal() const { return m_cal; }

    // Qt model 必需
    /**
     * @brief ParameterTableModel::rowCount
     * @details 返回当前行数。
     */
    int rowCount(const QModelIndex &parent = QModelIndex()) const override;
    /**
     * @brief ParameterTableModel::columnCount
     * @details 返回当前列数。
     */
    int columnCount(const QModelIndex &parent = QModelIndex()) const override;
    /**
     * @brief ParameterTableModel::headerData
     * @details 返回表头显示数据。
     */
    QVariant headerData(int section, Qt::Orientation o, int role) const override;
    /**
     * @brief ParameterTableModel::data
     * @details 返回单元格数据。
     */
    QVariant data(const QModelIndex &idx, int role) const override;
    /**
     * @brief ParameterTableModel::setData
     * @details 更新模型数据。
     */
    bool setData(const QModelIndex &idx, const QVariant &value, int role) override;
    /**
     * @brief ParameterTableModel::flags
     * @details 返回单元格交互标志。
     */
    Qt::ItemFlags flags(const QModelIndex &idx) const override;

    // 增删行
    /**
     * @brief ParameterTableModel::insertRows
     * @details 插入若干行。
     */
    bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;
    /**
     * @brief ParameterTableModel::removeRows
     * @details 删除若干行。
     */
    bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;

private:
    ParamTableKind m_kind = ParamTableKind::Attenuation;

    // 各类型数据容器（仅当前 kind 使用对应一个）
    AttTableList m_att;
    TransducerTableList m_trans;
    LimitLineList m_limit;
    QList<FreqTableConfig> m_freq;
    QList<CalTableConfig> m_cal;

    // 列定义（根据 kind）
    /**
     * @brief ParameterTableModel::cols
     * @details 依据当前类型返回列数。
     */
    int cols() const;
    QHash<int, QString> m_customHeader; // 每列自定义标题缓存
};
